package edu.uniquindio.prmaven.general;


import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;

import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * Clase que contiene la utilidad que permite realizar 
 * la lectura de una hoja de excel, enviando la ruta del archivo xls y la hoja a leer
 * @author DIANA
 *
 */
public class XlsReader {
	
	/**
	 * Lee una hoja de calculo de un archivo de excel y lo devuelve
	 * @param path ruta del archivo en excel formato 2003 o anterior
	 * @param sheetName nombre de la hoja de calculo
	 * @return table contiene la informacion leida de la hoja de calculo
	 */
	public static ArrayList<ArrayList<String>> readExcelSheet2003( String path, String sheetName ) {
		try {
	        FileInputStream fis = new FileInputStream( path );
	        POIFSFileSystem pfs = new POIFSFileSystem( fis );
	        HSSFWorkbook document = new HSSFWorkbook( pfs );
	        HSSFSheet sheet = document.getSheet( sheetName );
	        ArrayList<ArrayList<String>> table = new ArrayList<ArrayList<String>>();
	        ArrayList<String> tableRow = null;
	        
	        Row row = null;
	        for( int i = 1; i <= sheet.getLastRowNum(); i++ ) {
	            row = sheet.getRow( i );
	            
	            tableRow = new ArrayList<String>();
	            for( int j = 1; j < row.getLastCellNum(); j++ ) {
	            	tableRow.add( row.getCell( j ).getStringCellValue() );
	            }
	            
	            table.add( tableRow );
	        }
	        
	        fis.close();
	        
	        return table;
	    } 
		catch( IOException ioe ) {
	        System.out.println( ioe );
	    }
		
		return null;
	}	
	
	/**
	 * Lee una hoja de calculo de un archivo de excel y lo devuelve
	 * @param path ruta del archivo en excel formato 2003 o anterior
	 * @param sheetName nombre de la hoja de calculo
	 * @return table contiene la informacion leida de la hoja de calculo
	 */
	public static ArrayList<ArrayList<String>> readExcelSheet2007( String path, String sheetName ) {
		try {
	        FileInputStream fis = new FileInputStream( path );
	        XSSFWorkbook document = new XSSFWorkbook( fis );
	        XSSFSheet sheet = document.getSheet( sheetName );
	        ArrayList<ArrayList<String>> table = new ArrayList<ArrayList<String>>();
	        ArrayList<String> tableRow = null;
	        
	        Row row = null;
	        int lastRowNum = sheet.getLastRowNum();
	        int firstRowNum = sheet.getFirstRowNum();
	        int lastCellNum = 0;
            int firstCellNum = 0;
            
	        for( int i = firstRowNum; i <= lastRowNum; i++ ) {
	            row = sheet.getRow( i );
	            
	            tableRow = new ArrayList<String>();
	            lastCellNum = row.getLastCellNum();
	            firstCellNum = row.getFirstCellNum();
	            for( int j = firstCellNum; j < lastCellNum; j++ ) {
	            	tableRow.add(row.getCell( j ).getStringCellValue() );
	            }
	            
	            table.add( tableRow );
	        }
	        
	        fis.close();
	        
	        return table;
	    } 
		catch( IOException ioe ) {
	        System.out.println( ioe );
	    }
		
		return null;
	}
	
	/**
	 * Imprime la matriz en la consola
	 * @param table contiene la informacion a imprimir
	 */
	public static void printTable( ArrayList<ArrayList<String>> table ) {
		if( table == null )
			System.out.println( "No hay datos en la tabla" );
		
		for( int i = 0; i < table.size(); i++ ) {
			for( int j = 0; j < table.get(i).size(); j++ ) {
				System.out.print( table.get(i).get(j) );
				
				if( j < table.get(i).size()-1 ) {
					System.out.print( " - " );
				}
			}
			
			System.out.println();
		}
	}
		


}
